/**
 * Request Handler 각각 URL 에 대한 요청을 처리한다.
 * 여기서 정의한 handler는 index.js 에 Mapping 을 시켜줘야한다.
 *
 * @type {exports}
 * @author : Bang <beatyep5@gmail.com>
 * @date   : 2014. 4. 2.
 */

var url = require("url");
var querystring = require("querystring");
var mysql = require("mysql");
var date_utils = require('date-utils');

// HANRSS 의 DIRECTORY 에서 불러오는 RSS 목록을 가져오기 위한 함수가 구현되어 있는 라이브러리
// findByType, findByTypeAndPageNo
var Directory = require('../lib/Directory');

 /*
  *  getParameter : request 로부터 파라미터 값을 꺼낼때 사용.
  *   request 로 부터 key 에 대한 value 를 뽑아낸다.
  */
function getParameter(request, keyString){

    // request 로 부터 url 에서의 파라미터들을 받는다.
    var data = url.parse(request.url);
    // 받은 파라미터 쿼리화
    var query = data.query;

    // 쿼리의 파라미터를 객체화 시킨다. { key : value }
    var obj = querystring.parse(query);

    //객체를 문자로
    //querystring.stringify()

    // 객체에서 부터 해당 key 의 value 를 뽑아 return 한다.
    return obj[keyString];
}

 /*
  * start 요청에 대한 핸들러 (테스트)
  *   id 로 전달받은 파라미터를 로그에 출력
  *   ex) localhost:8888/start?id=user
  */
function start(response, request){
    console.log("Request Handler 'start' was called.");

    // id 파라미터의 값을 받는다.
    var value = getParameter(request, "id");

    // 콘솔에 기록한다.
    console.log("value : " + value);

    // 화면(브라우저) 에 출력
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Request Handler 'start' was called.");
    response.end();
}


/*
 * upload 요청에 대한 핸들러 (테스트)
 *   실제 업로드 테스트가 아닌 Directory 모듈의 findByType 테스트
 *   popular 타입 (인기 RSS) 를 조회하여 콘솔에 출력한다.
 *   ex) localhost:8888/upload
 */
function upload(response, request){
    console.log("Request Handler 'upload' was called.");

    // Directory 모듈의 findByType 함수 호출하고 결과로 받은 blogs 를 로그에 기록한다
    Directory.findByType('popular', function(err, blogs) {
        // http://www.hanrss.com/directory/index.qst?show=popular 의 내용을 가져온다. console.log 로 출력한다.
        console.log(blogs);
    });

    // 화면(브라우저)에 출력한다
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Request Handler 'upload' was called.");
    response.end();
}

/*
 * insert 요청에 대한 핸들러 (테스트)
 *   DB 에 데이터를 넣는 테스트
 *    하드코딩된 데이터를 DB에 입력한다.
 *    ex) localhost:8888/insert
 */
function insert(response, request){
    console.log("Request Handler 'insert' was called.");

    // DB 접속 정보
    var connection = mysql.createConnection({
        host : "202.68.237.242",
        port : 3306,
        user : "bettersoft",
        password : "better173300",
        database : "test_schema"
    });

    // 데이터 삽입 쿼리문
    var sqlQuery = "INSERT INTO hanrss_popular SET ?";
    // 쿼리에 전달할 데이터셋
    var post = {title : "title", description : "description", subscriber_count : "subscriber_count", url : "url", rss_url : "rss_url", register_date : "register_date"};

    // 쿼리 수행후 호출되는 콜백 함수
    function sqlCallback(err,result){
        if(err){
            throw err
        }
        console.log("SQL Complete!");
        console.log(query.sql);
    }

    // DB 연결하기
    connection.connect();

    // 쿼리 수행하기
    var query = connection.query(sqlQuery, post, sqlCallback);

    // DB 연결 끊기
    connection.end();

    // 화면(브라우저)에 출력한다
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Request Handler 'insert' was called.");
    response.end();
}

/*
 * insertRSSToDB 요청에 대한 핸들러
 *   Directory.findByType 호출후 받아온 RSS 정보들을 DB 에 저장한다
 *   ex) localhost:8888/insertRSSToDB
 */
function insertRSSToDB(response, request){

    console.log("Request Handler 'insertRSSToDB' was called.");

    // 전달 받은 데이터 저장하기 위한 용도
    var blogsData = null;

    // blogs 데이터를 받아온다
    Directory.findByType('popular', function(err, blogs) {

        // http://www.hanrss.com/directory/index.qst?show=popular 의 내용을 가져온다. console.log 에 로그를 확인한다.
//        console.log(blogs);

        // 전달 받은 데이터를 변수에 담는다
        blogsData = blogs;
//        console.log(blogsData);

        // DB 정보
        var connection = mysql.createConnection({
            host : "202.68.237.242",
            port : 3306,
            user : "bettersoft",
            password : "better173300",
            database : "test_schema"
        });
        var sqlQuery = "INSERT INTO hanrss_popular SET ?";

        // 쿼리에 전달할 데이터 셋 초기화
        var post = null;

        // 쿼리 수행후 실행될 콜백 함수
        function sqlCallback(err,result){
            if(err){
                throw err
            }
            // 쿼리 수행 결과 정보를 콘솔에 출력
            console.log("SQL Complete!" + ":: fieldCount:" + result["fieldCount"] + " // affectedRows:" + result["affectedRows"] + " // insertId:" + result["insertId"] + " // serverStatus:" + result["serverStatus"] + " // warningCount:" + result["warningCount"] + " // message:" + result["message"] + " // protocol41:" + result["protocol41"] + " // changedRows:" + result["changedRows"]);
        }

        // DB 연결하기
        connection.connect();

        // 가져온 blogsData 를 각 데이터 별로 쿼리를 실행하여 DB 에 저장한다
        for(var i = 0; i<blogsData.length; i++){
//      for(var i = 0; i<5; i++){         // test 로 5개만 저장할때

            // 현재시각을 적당한 포맷으로 생성
            var now = new Date();
            var nowTime = now.toFormat('YYYY-MM-DD HH24:MI:SS');

            // 쿼리에 전달할 데이터 세팅
            post = {title : blogsData[i].title, description : blogsData[i].description, subscriber_count : blogsData[i].subscriberCount, url : blogsData[i].url, rss_url : blogsData[i].rssUrl, register_date : nowTime};

            // 쿼리 수행
            var query = connection.query(sqlQuery, post, sqlCallback);

            // 수행된 쿼리 확인
            console.log(i+" : "+query.sql);
        }

        // DB 연결 끊기
        connection.end();

        // 화면(브라우저) 출력
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.write("Request Handler 'insert' was called.");
        response.end();
    });
}

exports.start = start;
exports.upload = upload;
exports.insert = insert;
//exports.select = select;
exports.insertRSSToDB = insertRSSToDB;